#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include "error.h"
#include "colap.h"

struct scolap {
	heap cola;
	int ctam;
};

colap
colap_create (const tcppos max)
{
	colap c=NULL;

	c = (colap) calloc (1,sizeof (struct scolap));
	if (c==NULL)
		err(EXIT_FAILURE,ERRFMT,"colap_create: lack of free memory",__LINE__);

	c->cola = hempty(max);
	c->ctam = 0;

	return c;
	
}

void
colap_encolar(colap c, const tcpalpha elem)
{
	assert (elem!=NULL);
	assert (!colap_llena(c));	/* cola_llena verifica que c!=NULL */
	c->cola = hadd(c->cola,elem);
	c->ctam++;
}

tcpalpha
colap_primero (const colap c)
{
	assert (!colap_vacia(c));	/* cola_vacia verifica que c!=NULL */
	return hroot(c->cola);		/* hroot se encarga de la clonacion */
}

void
colap_pop(colap c)
{
	assert(!colap_vacia(c));
	c->cola = hdel(c->cola,0);
	c->ctam = c->ctam - 1;
}

Bool
colap_vacia(const colap c)
{
	if (c==NULL)
		err(EXIT_FAILURE,ERRFMT,"colap_vacia: nil colap",__LINE__);
	else
		return (hIsEmpty(c->cola));
}

Bool
colap_llena(const colap c)
{
	if (c==NULL)
		err(EXIT_FAILURE,ERRFMT,"colap_llena: nil colap",__LINE__);
	else
		return (hIsFull(c->cola));
}

tcpalpha
colap_saca(colap c)
{
	tcpalpha a=NULL;
	assert (!colap_vacia(c));
	a = htake(c->cola);		/* htake elimina el elem. de c->cola al sacarlo */
	c->ctam = c->ctam - 1;
	return a;
}

colap
colap_destroy(colap c)
{
	if (c==NULL)
		return c;
	else
	{
		c->cola = hdestroy(c->cola);
		free(c);
		c=NULL;
		return c;
	}
}

/*	TEST	
int main (void)
{
	colap cp=NULL;
	tcpalpha a=NULL,b=NULL,c=NULL,aux=NULL;
	Bool b1=FALSE,b2=TRUE,b3=TRUE,b4=FALSE;

	a = alpha_create(1,2,20);
	b = alpha_create(1,3,30);
	c = alpha_create(2,3,100);

	cp = colap_create(3);
	b1 = colap_vacia(cp);
	colap_encolar(cp,c);
	b2 = colap_llena(cp);
	colap_encolar(cp,a);
	colap_encolar(cp,b);
	b3 = colap_vacia(cp);
	b4 = colap_llena(cp);

	if (b1 && !b2 && !b3 && b4)
		printf ("\nTest vacia/llena/encolar Superado\n");
	else
		printf ("\nTest vacia/llena/encolar Fallido\n");

	aux = colap_primero(cp);
	if (alpha_prior(aux)==20)
		printf("Test primero Superado\n");
	else
		printf("Test primero Fallido\n");

	aux = alpha_destroy(aux);
	colap_pop(cp);
	aux = colap_primero(cp);
	if (!colap_llena(cp) && alpha_prior(aux)==30)
		printf("Test pop Superado\n");
	else
		printf("Test pop Fallido\n");

	aux = alpha_destroy(aux);
	aux = colap_saca(cp);
	colap_encolar(cp,a);
	if (!colap_llena(cp) && alpha_prior(aux)==100)
		printf("Test saca_cualquiera Superado\n");
	else
		printf("Test saca_cualquiera Fallido\n");

	a = alpha_destroy(a);
	b = alpha_destroy(b);
	c = alpha_destroy(c);
	aux = alpha_destroy(aux);
	cp = colap_destroy(cp);
	if (cp==NULL)
		printf("Test destroy Superado\n");
	else
		printf("Test destroy Fallido\n");

	return 0;
}*/
